package com.rp.gateway.filter;//package com.rp.zuul.filter;
//
//import cn.hutool.json.JSONUtil;
//import com.netflix.zuul.ZuulFilter;
//import com.netflix.zuul.context.RequestContext;
//import com.netflix.zuul.exception.ZuulException;
//import com.rp.news.common.ResponseStatusEnum;
//import com.rp.news.common.Result;
//import com.rp.news.util.IPUtil;
//import com.rp.news.util.RedisOperator;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.cloud.context.config.annotation.RefreshScope;
//import org.springframework.http.MediaType;
//import org.springframework.stereotype.Component;
//
//import javax.servlet.http.HttpServletRequest;
//
//@Component
//@Slf4j
//@RefreshScope
//public class BlackIpFilter extends ZuulFilter {
//
//    @Autowired
//    private RedisOperator redis;
//
////    @Value("${name}")
////    private String name;
//
//    @Value("${blackIp.continueCounts}")
//    private Integer continueCounts; //ip连续请求的次数
//    @Value("${blackIp.limitTimes}")
//    private Integer limitTimes; //ip判断的时间间隔
//    @Value("${blackIp.timeInerval}")
//    private Integer timeInerval;//限制的时间
//
//    /**
//     * 定义过滤器的类型:
//     * pre: 请求在路由之前执行
//     * route: 路由请求的时候执行
//     * post: 请求路由以后执行
//     * error: 处理请求的时候发生错误执行
//     *
//     * @return
//     */
//    @Override
//    public String filterType() {
//        return "pre";
//    }
//
//    /**
//     * 过滤器执行的顺序,
//     * 执行顺序 从小到达
//     *
//     * @return
//     */
//    @Override
//    public int filterOrder() {
//        return 2;
//    }
//
//
//    /**
//     * 是否开启过滤
//     *
//     * @return
//     */
//    @Override
//    public boolean shouldFilter() {
//        return true;
//    }
//
//    /**
//     * 过滤器的业务实现
//     *
//     * @return
//     * @throws ZuulException
//     */
//    @Override
//    public Object run() throws ZuulException {
//
//        log.info("进入自定义过滤器2");
//
//        //获取上下文对象
//        RequestContext currentContext = RequestContext.getCurrentContext();
//        HttpServletRequest request = currentContext.getRequest();
//
//        //获取ip
//        String ip = IPUtil.getRequestIp(request);
//
//        /**
//         * 需求:
//         * 判断ip再在10s内的请求次数是否超过10次
//         * 如果超过,则限制这个ip访问15s,15s后再放行
//         */
//        String ipRedisKey = "zuul-ip:" + ip;
//        String ipRedisLimitKey = "zuul-ip-limit:" + ip;
//        //获取当前ip这个key的剩余时间
//
//        long ttl = redis.ttl(ipRedisLimitKey);
//        //如果当前限制的ip的key还存在剩余时间,说明这个ip不能访问,继续等待
//
//        if (ttl > 0) {
//            stopRequest(currentContext);
//            return null;
//        }
//
//        //在redis中累加ip的请求访问次数
//
//        long increment = redis.increment(ipRedisKey, 1);
//
//        //从0开始计算请求,初期访问为1,这设置过期时间,也就是连续请求的过期时间
//        if(increment ==1){
//            redis.expire(ipRedisKey,timeInerval);
//        }
//
//        //如果还能取得请求次数,说明用户连续请求的次数落在10秒内
//        //一旦请求的次数超过了连续访问的次数,则需要限制这个ip的访问
//
//        if(increment > continueCounts){
//          redis.set(ipRedisLimitKey,ipRedisLimitKey,limitTimes);
//          stopRequest(currentContext);
//          return null;
//        }
//
//        return null; //没有意义可以不管
//
//    }
//
//
//    private void stopRequest(RequestContext context) {
//        //停止zuul继续向下路由,禁止请求通信
//        context.setSendZuulResponse(false);
//        context.setResponseStatusCode(200);
//        Result result = Result.errorCustom(ResponseStatusEnum.ZUUL_ERROR);
//        String s = JSONUtil.toJsonStr(result);
//        context.getResponse().setCharacterEncoding("utf-8");
//        context.setResponseBody(s);
//        context.getResponse().setContentType(MediaType.APPLICATION_JSON_VALUE);
//
//    }
//
//
//}
